package model;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;

import util.Pair;

/**
 * Implementa a lógica do editor de textos da aplicação.
 * O editor pode criar arquivos novos, carregar arquivos salvos, salvar,
 * localizar palavras, imprimir, etc.
 * 
 * @author
 *
 */
public class Editor {
	
	private static Editor editor = null;
	
	private Editor(){
	}
	
	/**
	 * Singleton
	 * @return A instância única do editor.
	 */
	public static Editor getInstance(){
		if (editor == null){
			editor = new Editor();
		}
		return editor;
	}
	
	/**
	 * Abre um arquivo dado um caminho.
	 * @param caminho O arquivo do local especificado.
	 * @return
	 */
	public ArquivoEditor abrir(String caminho) {
		ArquivoEditor aq = null;
		try {
			aq = new ArquivoEditor(caminho);
		} catch (FileNotFoundException e) {
			
		}
		return aq;
	}
	
	/**
	 * Salva um arquivo num caminho fornecido.
	 * @param a O arquivo a ser salvo
	 * @param caminho O caminho onde salvar o arquivo
	 * @throws IOException
	 */
	public void salvar(ArquivoEditor a, String caminho) throws IOException{
		a.salvar(caminho);
	}
	
	/**
	 * Valida o conteudo do arquivo
	 * @param a O arquivo a ser validado
	 * @return True se for valido, false se nao
	 */
	public boolean validar(ArquivoEditor a){
		return a.valido();
	}
	
	/**
	 * Localiza um string no texto
	 * @param text O texto do arquivo
	 * @param toFind O string a ser localizado
	 * @return Uma lista de objetos Pair com as ocorrências
	 */
	public ArrayList<Pair> localizar(String text, String toFind) {
		ArrayList<Pair> found = new ArrayList<Pair>();
		int size = text.length() - toFind.length();
		int occurrence = 0;
		
		while (occurrence <= size) {
			occurrence = text.indexOf(toFind, occurrence);
			if (occurrence > -1) {
				found.add(new Pair(occurrence, occurrence + toFind.length()));
				occurrence += toFind.length();
			} else {
				return found.isEmpty() ? null : found;
			}
		}
		
		return found;
	}
	
	/**
     * Substitui a primeira ocorrência de um string no texto
     * @param texto
     * @param velha
     * @param nova
     * @return
     */
    public String substituir(String texto, String velha, String nova) {
        return texto.replace(velha, nova);
    }
   
    /**
     * Substitui todas as ocorrências de um string no texto
     * @param texto
     * @param velha
     * @param nova
     * @return
     */
    public String substituirTodas(String texto, String velha, String nova) {
        return texto.replaceAll(velha, nova);
    }
	
	/**
	 * Fabrica de arquivos usada para esconder a classe ArquivoEditor
	 * @param conteudo O conteudo do arquivo a ser criado
	 * @return O arquivo criado
	 */
	public ArquivoEditor arqFactory(String conteudo){
		ArquivoEditor a = new ArquivoEditor();
		a.setConteudo(conteudo);
		return a;
	}
}
